package day17;
//静态同步方法 和同步方法
public class Demo3 {
    //同步方法: 锁的是this
    public synchronized void aaa(){  //加了锁,其他线程只要同一把锁需要等待
        String name=Thread.currentThread().getName();
        System.out.println(name+"开始执行A方法");
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name+"结束执行A方法");
    }//释放了锁 其他线程可以竞争锁 可以执行了
    public synchronized void bbb(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"开始执行B方法");
        System.out.println(name+"结束执行B方法");
    }
    //静态同步方法: 锁的是Demo3.class
    public static synchronized void ccc(){
        String name=Thread.currentThread().getName();
        System.out.println(name+"开始执行C方法");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(name+"结束执行C方法");
    }

    public static void main(String[] args) {
        Demo3 d=new Demo3(); //它就是this
        new Thread(()->{
            d.aaa();
        },"A").start();
        new Thread(()->{
            d.bbb();
        },"B").start();
        new Thread(()->{
            Demo3.ccc();
        },"C").start();
        new Thread(()->{
            //同步代码块:锁的是什么? 就是参数
            synchronized (Demo3.class){  //加锁
                String name=Thread.currentThread().getName();
                System.out.println(name+"开始执行同步代码块");
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(name+"结束执行同步代码块");
            }//释放锁
        },"D").start();
    }
}